有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何为映射实现创建自定义迭代器?

我实现了一个独特的地图。这是一个双向的哈希映射,其中不仅键是唯一的,而且值也是唯一的

public interface UniqueMap<K,V>{

    V uniquePut(K key, V value);

    UniqueMap<V,K> inverse(); 
}

这是一种可能的实现方式:

public class SimpleUniqueMap<K,V> implements UniqueMap<K,V>, Iterable<K>{

    public HashMap<K,V> uniqueMap = new HashMap<K,V>();

    class EnumSimpleUniqueMap implements Iterator<K>{

        int count = uniqueMap.size();

        public boolean hasNext(){
            return count > 0;
        }

        public K next(){
            if(count == 0){
                throw new NoSuchElementException();     
            }else{
                count--;
                //...
            }
        }

        public void remove(){
            throw new UnsupportedOperationException();
        }
    }

    public Iterator<V> iterator(){
        return new EnumSimpleUniqueMap();
    }

    public V uniquePut(K key, V value){ 
        return null;
    }

    public UniqueMap<V,K> inverse(){
        return null;
    }
}

正如你所见,我已经尝试为我的唯一映射实现一个迭代器。但是从hashmap中,值不是通过位置而是通过键来访问的。所以通常我会取计数器和访问值,但在这种情况下,这是不可能的

实际上,迭代这些键并逐个检索它们就足够了。我该怎么做?有没有办法检索某种同时包含键和值的条目对象

我知道我可以从映射对象中检索迭代器,但这不是我的选项


共 (3) 个答案

  1. # 1 楼答案

    更新:最简单的方法是使用

    org.apache.commons.collections.BidiMap
    
    但是如果你真的想自己翻滚,那么考虑一下:

    通常,Maps不实现Iterable。在您的情况下,您可以通过调用其中任何一个来免费获得Iterator

    map.keys().iterator(); // is the same as
    map.inverse().values().iterator();
    
    map.values().iterator(); // is the same as
    map.inverse().keys().iterator();
    
    map.entrySet().iterator(); // almost the same as
    map.inverse().entrySet().iterator();
    

    在你的地图上,取决于你想要迭代的内容。为此,你必须

    public interface UniqueMap<K,V> extends Map<K, V> {
        // no need for uniquePut(), you already have Map.put()
        UniqueMap<V,K> inverse(); 
    }
    

    扩展实现也是一个好主意

    java.util.AbstractMap<K, V>
    

    它已经有了很多地图的基本功能

  2. # 2 楼答案

    您可以通过简单地委托给支持hashmap的键集迭代器来实现iterator()方法:

    public Iterator<K> iterator(){
        return uniqueMap.keySet().iterator();
    }
    

    当然,正如卢卡斯所说,通常地图是不可编辑的,但它提供的集合视图本身是可编辑的

    另外,对于您独特的映射实现来说,在两个方向上都有哈希映射可能是一个好主意

    此外,请思考(并在界面中指定):如果用户插入一个具有现有值的新密钥,会发生什么情况?这会失败、被忽略、删除现有映射,还是什么

  3. # 3 楼答案

    你应该看看Guava library(谷歌收藏)。他们有一个BiMap实现,这似乎正是您试图实现的